import type { RouteRecordRaw } from 'vue-router'

/**
 * 用于加载本地路由;
 * @/router/main目录下的所有.ts文件
 * @returns 返回一个RouteRecordRaw类型的数组，即本地路由数组
 */
export function loadlocalRoutes() {
  // 定义一个空数组，用于存储本地路由
  const localRoutes: RouteRecordRaw[] = []
  // 使用import.meta.glob方法，导入所有以.ts结尾的文件，并将其存储在files对象中
  // 定义一个名为files的常量，类型为Record<string, any>，即一个以字符串为键，任意类型为值的对象
  const files: Record<string, any> = import.meta.glob(
    // 使用import.meta.glob函数，导入@/router/main目录下的所有.ts文件
    '@/router/main/**/**.ts',
    // 设置eager为true，表示立即导入这些文件
    {
      eager: true
    }
  )
  // 遍历files对象中的所有文件
  for (const key in files) {
    // 获取每个文件对应的模块
    const module = files[key]
    // 将模块中的默认路由添加到localRoutes数组中
    localRoutes.push(module.default)
  }
  // 返回localRoutes数组
  return localRoutes
}

/**
 * 获取第一个菜单
 */
export let firstMenu: any = null

/**
 * 将用户菜单映射到路由
 * @param userMenus 用户菜单
 * @returns
 */
export function mapMenusToRoutes(userMenus: any[]) {
  // 加载本地路由
  const localRoutes = loadlocalRoutes()
  // 定义一个空数组，用于存储映射后的路由
  const routes: RouteRecordRaw[] = []
  if (!Array.isArray(userMenus)) {
    return routes
  }
  // 遍历用户菜单
  for (const menu of userMenus) {
    // 遍历子菜单
    for (const submenu of menu.children) {
      // 在本地路由中查找与子菜单路径相同的路由
      const route = localRoutes.find((item) => item.path === submenu.url)
      // 如果找到了，则将其添加到映射后的路由数组中
      if (route) {
        // 给route的顶层菜单增加重定向
        if (!routes.find((item) => item.path === submenu.url)) {
          routes.push({ path: menu.url, redirect: route.path })
        }
        // 将找到的路由添加到映射后的路由数组中
        routes.push(route)
        // 匹配第一个菜单
        if (!firstMenu) {
          firstMenu = submenu
        }
      }
    }
  }
  // 返回映射后的路由数组
  return routes
}

/**
 * 根据路径匹配相应的菜单
 * @param path 当前路径
 * @param userMenus
 */
export function pathMapToMenu(path: string, userMenus: any[]) {
  for (const menu of userMenus) {
    for (const submenu of menu) {
      if (submenu.url === path) {
        return submenu
      }
    }
  }
  return undefined
}

export function mapPathToBreadCrumbs(path: string, userMenus: any[]) {
  const breadcrumbs: any[] = []
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        breadcrumbs.push(menu)
        breadcrumbs.push(submenu)
      }
    }
  }
  return breadcrumbs
}
